/**
 * 反馈工具类，用于在前端应用程序中显示各种类型的用户反馈信息。
 */
// ts 忽略文件
// @ts-nocheck
// 如果按需引入了 ElementPlus，则要注释下面导入，因为手动导入组件，会导致组件样式丢失，组件样式不会自动引入
// import { ElLoading, ElMessage, ElMessageBox, type ElMessageBoxOptions, ElNotification } from "element-plus";
import type { LoadingInstance } from "element-plus/es/components/loading/src/loading";

export class Feedback {
    /**
     * 用于存储加载实例的私有变量。
     */
    private loadingInstance: LoadingInstance | null = null;

    /**
     * 单例模式的静态实例变量。
     */
    static instance: Feedback | null = null;

    /**
     * 获取 Feedback 类的单例实例。
     * @returns Feedback 类的单例实例。
     */
    static getInstance() {
        return this.instance ?? (this.instance = new Feedback());
    }

    /**
     * 显示普通消息提示。
     * @param msg - 消息内容。
     */
    msg(msg: string) {
        ElMessage.info(msg);
    }

    /**
     * 显示错误消息提示。
     * @param msg - 错误消息内容。
     */
    msgError(msg: string) {
        ElMessage.error(msg);
    }

    /**
     * 显示成功消息提示。
     * @param msg - 成功消息内容。
     */
    msgSuccess(msg: string) {
        ElMessage.success(msg);
    }

    /**
     * 显示警告消息提示。
     * @param msg - 警告消息内容。
     */
    msgWarning(msg: string) {
        ElMessage.warning(msg);
    }

    /**
     * 显示普通弹出提示框。
     * @param msg - 提示内容。
     */
    alert(msg: string) {
        ElMessageBox.alert(msg, "系统提示");
    }

    /**
     * 显示错误弹出提示框。
     * @param msg - 错误提示内容。
     */
    alertError(msg: string) {
        ElMessageBox.alert(msg, "系统提示", { type: "error" });
    }

    /**
     * 显示成功弹出提示框。
     * @param msg - 成功提示内容。
     */
    alertSuccess(msg: string) {
        ElMessageBox.alert(msg, "系统提示", { type: "success" });
    }

    /**
     * 显示警告弹出提示框。
     * @param msg - 警告提示内容。
     */
    alertWarning(msg: string) {
        ElMessageBox.alert(msg, "系统提示", { type: "warning" });
    }

    /**
     * 显示普通通知提示。
     * @param msg - 通知内容。
     */
    notify(msg: string) {
        ElNotification.info(msg);
    }

    /**
     * 显示错误通知提示。
     * @param msg - 错误通知内容。
     */
    notifyError(msg: string) {
        ElNotification.error(msg);
    }

    /**
     * 显示成功通知提示。
     * @param msg - 成功通知内容。
     */
    notifySuccess(msg: string) {
        ElNotification.success(msg);
    }

    /**
     * 显示警告通知提示。
     * @param msg - 警告通知内容。
     */
    notifyWarning(msg: string) {
        ElNotification.warning(msg);
    }

    /**
     * 显示确认对话框。
     * @param msg - 确认内容。
     * @returns Promise，解析为用户的选择（确认或取消）。
     */
    confirm(msg: string) {
        return ElMessageBox.confirm(msg, "温馨提示", {
            confirmButtonText: "确定",
            cancelButtonText: "取消",
            type: "warning"
        });
    }

    /**
     * 显示提交内容对话框。
     * @param content - 提示内容。
     * @param title - 对话框标题。
     * @param options - 可选的 ElMessageBox 选项。
     * @returns Promise，解析为用户输入的内容及其选择（确认或取消）。
     */
    prompt(content: string, title: string, options?: ElMessageBoxOptions) {
        return ElMessageBox.prompt(content, title, {
            confirmButtonText: "确定",
            cancelButtonText: "取消",
            ...options
        });
    }

    /**
     * 打开全局加载提示。
     * @param msg - 加载提示内容。
     */
    loading(msg: string) {
        this.loadingInstance = ElLoading.service({
            lock: true,
            text: msg
        });
    }

    /**
     * 关闭全局加载提示。
     */
    closeLoading() {
        this.loadingInstance?.close();
    }
}

/**
 * Feedback 类的单例实例。
 */
const feedback = Feedback.getInstance();

export default feedback;
